/* -*- mode: c++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil; -*- */

#ifndef CONFIG_H
#define CONFIG_H

#include <map>
#include <string>

class Config
{
public:
    enum LoadResult {
        LR_PREPARE,

        LR_SUCC,

        LR_IO_FAILED,

        LR_INVALID_FORMAT,
    };

protected:
    struct value_t {
        /* 存储原始的字符串形式的值
         */
        std::string     str;

        /* 如果值的第一个字符是 '0' - '9'
         * 那么把它转换成整数值
         */
        int             i;
    };

    typedef std::map<std::string, value_t *> ValueMap;

    ValueMap            _values;

    LoadResult          _lr;

    int                 _failed_at_lineno;

    void _clear();

public:
    Config();

    Config(const char *fn);

    ~Config()
    {
        _clear();
    }

    bool load(const char *fn);

    bool append(const char *fn);

    int getInt(const std::string& key);

    std::string &getStr(const std::string& key);

    bool exists(const std::string& key);

    LoadResult get_load_result() const { return _lr; }

    int get_failed_lineno() const { return _failed_at_lineno; }

    void get_error_desc(std::string& res);
};

#endif
